﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using UricaoWeb.LogicaDeNegocios.Cargos;
using System.Text.RegularExpressions;
using UricaoWeb.Presentacion;
using UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles;


public partial class _api_cargo_agregar : API_Seguridad_Principal
{
    #region Parametros

    //son los parametros que se utilizan en la clase para las comparaciones.
    private readonly string _funcionRealizar = "Insertar";
    private readonly string _caracter = "Caracteres restantes: ";
    private readonly string _mensajeCaracteresEspeciales = "Cargo inválido. Sólo letras y espacios. 4-50 caracteres.";
    private readonly string _pathError = "images/NotAvailable.jpg";
    private readonly string _pathLimpiar = "images/inicial.GIF";
    private readonly string _mensajeCaracteres = "Numero de caracteres no permitido";
    private readonly string _mensajeCampo = "Campo Obligatorio";
    private readonly string _mensajeUsuario = "Nombre de cargo no disponible";
    private readonly string _mensajeRegistroExitoso = "Se ha registrado exitosamente el cargo";
    private readonly int _disponibilidad = 0;
    private readonly int _longitudMaxima = 50;
    private readonly int _longitudMinima = 4;
    private readonly int _intervalorReloj = 2000;
    private readonly int _excepcion = -1;
    public static int _fkHotel = 1;
    private readonly string _mensajeExcepcion = "No se pudo realizar su solicitud. Intente más tarde"; 

    #endregion

    #region Metodos

    /// <summary>
    ///Constructor por defecto de la clase.
    /// </summary>
    protected void Page_Load(object sender, EventArgs e) 
    {
        if (Session["user"] != null)
        {
            Logica_Usuario usuario = (Logica_Usuario)Session["user"];
            _fkHotel = Convert.ToInt32(usuario.FkHotel);

            var master = Master as MasterPage;
            if (master != null)
                master.actualizar_label();
            base.validar_usuario();
        }
        else
            Server.Transfer("API_Seguridad_Login_.aspx", false);
       
           
    }

    /// <summary>
    ///Metodo agrega un cargo en la base de datos, este se agrega exitosamente si pasa todas la validaciones
    ///como: la longitud minima y maxima permitida, verificar si el nombre solo tiene letras y espacios, si el
    ///cargo no existe en el sistema.
    /// </summary>
     public void AgregarCargo(object sender, EventArgs e)
    {
        if (!String.IsNullOrEmpty(_nombreCargo.Text))
        {
            if(VerificarLongitudCadena())
            {    if(VerificarCaracteres())
                 {  
                    int _coincidencia = new Cargo().VerificarExistenciaCargo(_nombreCargo.Text,_funcionRealizar);

                    if (_coincidencia == _disponibilidad)
                    {
                        Page.ClientScript.RegisterStartupScript(this.GetType(), "alert" + UniqueID, "alert('" + _mensajeRegistroExitoso + "');", true);
                        LimpiarPantalla();
                    }
                    else
                    {
                        if (_coincidencia == _excepcion)
                            MostrarMensaje(_mensajeExcepcion);
                        else
                            MostrarMensaje(_mensajeUsuario);
                    }
                  }
                  else
                    MostrarMensaje(_mensajeCaracteresEspeciales);

             }
            else 
                MostrarMensaje(_mensajeCaracteres);
        }
        else
            MostrarMensaje(_mensajeCampo);
      }

     /// <summary>
     ///Metodo cuando el tiempo del reloj se ha acabo realiza 
     ///estas acciones.
     /// </summary>
     /// <param name="sender">Es un objeto del tipo de clase sistema</param>
     /// <param name="e">evento del reloj</param>
    protected void Timer1_Tick(object sender, EventArgs e)
    {
        _mensaje.Text = null;
        _imgStatus.ImageUrl = _pathLimpiar;
        _nombreCargo.Text = null;
        Timer1.Enabled = false;
    }

    /// <summary>
    ///Metodo que realiza una accion cuando el textbox de _nombreCargo cambia, coloca
    ///el numero de caracteres restantes a medida que el usuario va llenando este textbox.
    /// </summary>
    /// <param name="sender">Es un objeto del tipo de clase sistema</param>
    /// <param name="e">evento de cambio de texto</param>
    protected void _nombreCargo_TextChanged(object sender, EventArgs e)
    {
        _contador.Text =_caracter+(_longitudMaxima -_nombreCargo.Text.Length).ToString();
    }

    /// <summary>
    ///Metodo que muestra los mensajes de error al usuario, es decir, los errores que esta cometiendo 
    ///el proceso de llenado del formulario.
    /// </summary>
    /// <param name="_Mensaje">Es el mensaje que se le mostrara por pantalla al usuario con la descripcion de dicho error</param>
    protected void MostrarMensaje(string _Mensaje) 
    {
        _mensaje.Text = _Mensaje;
        _mensaje.ForeColor = System.Drawing.Color.Red;
        _imgStatus.ImageUrl = _pathError;
        ActivarReloj();
        
    }

    /// <summary>
    ///Metodo que verifica los caracteres permitidos en el campo _nombreCargo, los cuales son:
    ///letra y espacios en blancos.
    /// </summary>
    /// <returns>Retorna true si cumple con los caracteres permitidos, en caso contrario retorna false</returns>
    protected bool VerificarCaracteres() 
    {
        string _expresionesRegulares = "^[A-Z a-z]*$";

        Regex rgTexto = new Regex(_expresionesRegulares);
        
        if (rgTexto.IsMatch(_nombreCargo.Text))
            return true;
        else
            return false;
    }

    /// <summary>
    ///Metodo que verifica la longitud del texto de _nombreCargo, siendo la longitud minima del mismo igual a 4
    ///y la longitud maxima igual a 50
    /// </summary>
    /// <returns>Retorna true si cumple con la longitud minima y maxima, en caso contrario devuelve false</returns>
    protected bool VerificarLongitudCadena()
    {
        int _longitudCadena = _nombreCargo.Text.Length;
        int _numeroCaracteres = _longitudMaxima - _longitudCadena;

        if ((_longitudCadena >= _longitudMinima) && (_numeroCaracteres >= _longitudMinima))
            return true;
        else
            return false;
    }

    /// <summary>
    ///Metodo que activa el reloj, esto me sirve para limpiar los mensajes de errores mostrados en 
    ///pantallas luego de tanto tiempo.
    /// </summary>
    protected void ActivarReloj() 
    {
        Timer1.Enabled = true;
        Timer1.Interval = _intervalorReloj;
    }

    /// <summary>
    ///Metodo que limpia los mensajes de error.
    /// </summary>
    protected void LimpiarMensaje() 
    {
        _mensaje = null;
        Timer1.Enabled = false;
    }

    /// <summary>
    ///Metodo que limpia la pantalla luego de haberse ingresado el cargo exitosamente en el sistema.
    /// </summary>
    protected void LimpiarPantalla() 
    {
        string _mensajeContador = "Caracteres restantes: 50";

        _mensaje = null;
        _contador.Text = _mensajeContador;
        _nombreCargo.Text = null;
    }
    

    #endregion 

 }
